﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SIIV.Data;
using SIIV.Business.Exceptions;

namespace SIIV.View.Web.Controllers
{
    public class SeguridadController : BaseController
    {
        //
        // GET: /Account/

        public ActionResult Inicio()
        {
            ViewBag.Error = string.Empty;
            return View();
        }

        [HttpGet]
        public ActionResult Login()
        {
            return RedirectToAction("Inicio");
        }

        [HttpPost]
        public ActionResult Login(string usuario, string contraseña)
        {
            try
            {
                Usuario u = Usuarios.ObtenerUsuario(usuario, contraseña);
                if (!u.IdRol.Equals((short)SIIV.Business.Roles.Veterinario))
                    throw new FunctionalException("Veterinario inexistente.");
                Session["Usuario"] = Usuarios.ObtenerUsuario(usuario, contraseña);
                return RedirectToAction("Inicio");
            }
            catch (FunctionalException ex)
            {
                ViewBag.Error = ex.Message;
                return View("Inicio");
            }
            catch (Exception ex)
            {
                ViewBag.Excepcion = ex;
                return View("Error");
            }
        }

        [HttpGet]
        public ActionResult Logout()
        {
            Session.Abandon();
            return RedirectToAction("Inicio");
        }

        [HttpGet]
        public ActionResult DatosUsuario()
        {
            return View();
        }

        [HttpPost]
        public ActionResult ActualizarDatosUsuario(string nombre, string apellido, string password, string email, long nroDocumento, DateTime fechaNacimiento)
        {
            try
            {
                Usuarios.ActualizarUsuario(VeterinarioLogueado.IdUsuario, apellido, password, email, nombre, nroDocumento, VeterinarioLogueado.Username, fechaNacimiento, Business.Roles.Veterinario);
                Session["Usuario"] = Usuarios.ObtenerUsuario(VeterinarioLogueado.IdUsuario);
                return Json("Sus datos han sido actualizados.");
            }
            catch (FunctionalException ex)
            {
                return Json(ex.Message);
            }
            catch (Exception ex)
            {
                ViewBag.Excepcion = ex;
                return View("Error");
            }
        }
    }

    public class CustomIdentity : System.Security.Principal.IIdentity
    {
        private string username = string.Empty;
        private string rol;

        public CustomIdentity(Usuario usuarioLogueado)
        {
            username = usuarioLogueado.Username;
            rol = usuarioLogueado.Rol.Nombre;
        }

        public string AuthenticationType
        {
            get { return "Custom"; }
        }

        public bool IsAuthenticated
        {
            get { return username != string.Empty; }
        }

        public string Name
        {
            get { return username; }
        }

        public string Rol { get { return rol; } }
    }

    public class CustomPrincipal : System.Security.Principal.IPrincipal
    {
        public CustomPrincipal(CustomIdentity identity)
        {
            this.Identity = identity;
        }

        public System.Security.Principal.IIdentity Identity
        {
            get;
            private set;
        }

        public bool IsInRole(string role)
        {
            return ((CustomIdentity)Identity).Rol.Equals(role);
        }
    }
}
